package cc.iotkit.test;

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.util.HashMap;
import java.util.Map;

public class SimpleMqttServer {

    private static final String BROKER_URI = "tcp://192.168.1.241:1883"; // 假设你将在本地运行并监听1883端口
    private static final Map<String, String> userPasswords = new HashMap<>(); // 简单的用户存储

    static {
        userPasswords.put("wzr1", "psswd1"); // 添加一个用户和密码
    }

    public static void main(String[] args) throws Exception {
        MqttClient client = new MqttClient(BROKER_URI, MqttClient.generateClientId(), new MemoryPersistence());

        // 设置回调来处理连接丢失、消息到达等事件
        client.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable cause) {
                System.out.println("Connection lost: " + cause.getMessage());
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                System.out.println("Message arrived. Topic: " + topic + " Message: " + new String(message.getPayload()));
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                System.out.println("Delivery complete.");
            }
        });

        // 创建一个简单的线程来模拟服务端监听连接请求（这不是真正的服务端实现，仅用于演示）
        new Thread(() -> {
            try {
                client.connect(createMqttConnectOptions("user1", "password1")); // 使用正确的用户名和密码进行连接
                System.out.println("Connected to MQTT broker.");

                // 在这里你可以添加代码来处理订阅、发布等

                // 为了保持连接，我们不退出这个线程
                Thread.sleep(Long.MAX_VALUE);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }

    private static MqttConnectOptions createMqttConnectOptions(String username, String password) {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setUserName(username);
        options.setPassword(password.toCharArray());
        options.setCleanSession(true);
        // 注意：这里我们没有设置服务端URI，因为我们实际上是在尝试连接到一个已经存在的MQTT代理（如Mosquitto），
        // 并模拟了用户验证。真正的服务端实现需要处理客户端连接请求，并验证用户名和密码。
        // 由于这是一个简化的示例，我们实际上是在尝试连接到一个MQTT代理，并期望用户名和密码是正确的。
        return options;
    }
}